/**
 * 体测数据评分计算工具
 */

// BMI指数评分标准 - 男生
const maleBmiStandard = {
  // 年级: [低体重上限, 正常下限, 正常上限, 超重上限]
  '1': [13.4, 13.5, 18.1, 20.3],   // 一年级
  '2': [13.6, 13.7, 18.4, 20.4],   // 二年级
  '3': [13.8, 13.9, 19.4, 22.1],   // 三年级
  '4': [14.1, 14.2, 20.1, 22.6],   // 四年级
  '5': [14.3, 14.4, 21.4, 24.1],   // 五年级
  '6': [14.6, 14.7, 21.8, 24.5],   // 六年级
  '7': [15.4, 15.5, 22.1, 24.9],   // 初一
  '8': [15.6, 15.7, 22.5, 25.2],   // 初二
  '9': [15.7, 15.8, 22.8, 26.0],   // 初三
  '10': [16.4, 16.5, 23.2, 26.3],  // 高一
  '11': [16.7, 16.8, 23.7, 26.5],  // 高二
  '12': [17.2, 17.3, 23.8, 27.3],  // 高三
  '13': [17.8, 17.9, 23.9, 27.9],  // 大学
};

// BMI指数评分标准 - 女生
const femaleBmiStandard = {
  // 年级: [低体重上限, 正常下限, 正常上限, 超重上限]
  '1': [13.2, 13.3, 17.3, 19.2],   // 一年级
  '2': [13.4, 13.5, 17.8, 20.2],   // 二年级
  '3': [13.5, 13.6, 18.6, 21.1],   // 三年级
  '4': [13.6, 13.7, 19.4, 22.0],   // 四年级
  '5': [13.7, 13.8, 20.5, 22.9],   // 五年级
  '6': [14.1, 14.2, 20.8, 23.6],   // 六年级
  '7': [14.7, 14.8, 21.7, 24.4],   // 初一
  '8': [15.2, 15.3, 22.2, 24.8],   // 初二
  '9': [15.9, 16.0, 22.6, 25.1],   // 初三
  '10': [16.4, 16.5, 22.7, 25.2],  // 高一
  '11': [16.8, 16.9, 23.2, 25.4],  // 高二
  '12': [17.0, 17.1, 23.3, 25.7],  // 高三
  '13': [17.1, 17.2, 23.9, 27.9],  // 大学
};

// 肺活量评分标准 - 男生
const maleVitalCapacityStandard = {
  // 年级: [分数区间对应的肺活量值]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '1': [1700, 1600, 1500, 1400, 1300, 1240, 1180, 1120, 1060, 1000, 940, 880, 820, 760, 700, 660, 620, 580, 540, 500],
  '2': [2000, 1900, 1800, 1650, 1500, 1430, 1360, 1290, 1220, 1150, 1080, 1010, 940, 870, 800, 750, 700, 650, 600, 550],
  '3': [2300, 2200, 2100, 1900, 1700, 1620, 1540, 1460, 1380, 1300, 1220, 1140, 1060, 980, 900, 840, 780, 720, 660, 600],
  '4': [2600, 2500, 2400, 2150, 1900, 1820, 1740, 1660, 1580, 1500, 1420, 1340, 1260, 1180, 1100, 1030, 960, 890, 820, 750],
  '5': [2900, 2800, 2700, 2450, 2200, 2110, 2020, 1930, 1840, 1750, 1660, 1570, 1480, 1390, 1300, 1220, 1140, 1060, 980, 900],
  '6': [3200, 3100, 3000, 2750, 2500, 2400, 2300, 2200, 2100, 2000, 1900, 1800, 1700, 1600, 1500, 1410, 1320, 1230, 1140, 1050],
  '7': [3640, 3520, 3400, 3150, 2900, 2780, 2660, 2540, 2420, 2300, 2180, 2060, 1940, 1820, 1700, 1600, 1500, 1400, 1300, 1200],
  '8': [3940, 3820, 3700, 3450, 3200, 3080, 2960, 2840, 2720, 2600, 2480, 2360, 2240, 2120, 2000, 1890, 1780, 1670, 1560, 1450],
  '9': [4240, 4120, 4000, 3750, 3500, 3380, 3260, 3140, 3020, 2900, 2780, 2660, 2540, 2420, 2300, 2180, 2060, 1940, 1820, 1700],
  '10': [4540, 4420, 4300, 4050, 3800, 3680, 3560, 3440, 3320, 3200, 3080, 2960, 2840, 2720, 2600, 2470, 2340, 2210, 2080, 1950],
  '11': [4740, 4620, 4500, 4250, 4000, 3880, 3760, 3640, 3520, 3400, 3280, 3160, 3040, 2920, 2800, 2660, 2520, 2380, 2240, 2100],
  '12': [4940, 4820, 4700, 4450, 4200, 4080, 3960, 3840, 3720, 3600, 3480, 3360, 3240, 3120, 3000, 2850, 2700, 2550, 2400, 2250],
  '13': [5040, 4920, 4800, 4550, 4300, 4180, 4060, 3940, 3820, 3700, 3580, 3460, 3340, 3220, 3100, 2940, 2780, 2620, 2460, 2300],
  '14': [5140, 5020, 4900, 4650, 4400, 4280, 4160, 4040, 3920, 3800, 3680, 3560, 3440, 3320, 3200, 3030, 2860, 2690, 2520, 2350],
};

// 肺活量评分标准 - 女生
const femaleVitalCapacityStandard = {
  // 年级: [分数区间对应的肺活量值]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '1': [1400, 1300, 1200, 1100, 1000, 960, 920, 880, 840, 800, 760, 720, 680, 640, 600, 580, 560, 540, 520, 500],
  '2': [1600, 1500, 1400, 1300, 1200, 1150, 1100, 1050, 1000, 950, 900, 850, 800, 750, 700, 680, 660, 640, 620, 600],
  '3': [1800, 1700, 1600, 1500, 1400, 1340, 1280, 1220, 1160, 1100, 1040, 980, 920, 860, 800, 780, 760, 740, 720, 700],
  '4': [2000, 1900, 1800, 1700, 1600, 1530, 1460, 1390, 1320, 1250, 1180, 1110, 1040, 970, 900, 880, 860, 840, 820, 800],
  '5': [2250, 2150, 2050, 1950, 1850, 1770, 1690, 1610, 1530, 1450, 1370, 1290, 1210, 1130, 1050, 1020, 990, 960, 930, 900],
  '6': [2500, 2400, 2300, 2200, 2100, 2010, 1920, 1830, 1740, 1650, 1560, 1470, 1380, 1290, 1200, 1170, 1140, 1110, 1080, 1050],
  '7': [2750, 2650, 2550, 2450, 2350, 2250, 2150, 2050, 1950, 1850, 1750, 1650, 1550, 1450, 1350, 1310, 1270, 1230, 1190, 1150],
  '8': [2900, 2850, 2800, 2650, 2500, 2400, 2300, 2200, 2100, 2000, 1900, 1800, 1700, 1600, 1500, 1460, 1420, 1380, 1340, 1300],
  '9': [3050, 3000, 2950, 2800, 2650, 2550, 2450, 2350, 2250, 2150, 2050, 1950, 1850, 1750, 1650, 1610, 1570, 1530, 1490, 1450],
  '10': [3150, 3100, 3050, 2900, 2750, 2650, 2550, 2450, 2350, 2250, 2150, 2050, 1950, 1850, 1750, 1710, 1670, 1630, 1590, 1550],
  '11': [3250, 3200, 3150, 3000, 2850, 2750, 2650, 2550, 2450, 2350, 2250, 2150, 2050, 1950, 1850, 1810, 1770, 1730, 1690, 1650],
  '12': [3350, 3300, 3250, 3100, 2950, 2850, 2750, 2650, 2550, 2450, 2350, 2250, 2150, 2050, 1950, 1910, 1870, 1830, 1790, 1750],
  '13': [3400, 3350, 3300, 3150, 3000, 2900, 2800, 2700, 2600, 2500, 2400, 2300, 2200, 2100, 2000, 1960, 1920, 1880, 1840, 1800],
  '14': [3450, 3400, 3350, 3200, 3050, 2950, 2850, 2750, 2650, 2550, 2450, 2350, 2250, 2150, 2050, 2010, 1970, 1930, 1890, 1850],
};

// 对应的分数区间
const vitalCapacityScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 50米跑评分标准 - 男生
const maleRun50MStandard = {
  // 年级: [分数区间对应的50米跑时间]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  // 注意：由于50米跑是成绩越低越好，所以数组中的值是升序排列的
  '1': [10.2, 10.3, 10.4, 10.5, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0, 12.2, 12.4, 12.6, 12.8, 13.0, 13.2, 13.4, 13.6],
  '2': [9.6, 9.7, 9.8, 9.9, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0, 12.2, 12.4, 12.6, 12.8, 13.0],
  '3': [9.1, 9.2, 9.3, 9.4, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1, 12.3, 12.5],
  '4': [8.7, 8.8, 8.9, 9.0, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1],
  '5': [8.4, 8.5, 8.6, 8.7, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8],
  '6': [8.2, 8.3, 8.4, 8.5, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6],
  '7': [7.8, 7.9, 8.0, 8.1, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2],
  '8': [7.5, 7.6, 7.7, 7.8, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9],
  '9': [7.3, 7.4, 7.5, 7.6, 7.7, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7],
  '10': [7.1, 7.2, 7.3, 7.4, 7.5, 7.7, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5],
  '11': [7.0, 7.1, 7.2, 7.3, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4],
  '12': [6.8, 6.9, 7.0, 7.1, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2],
  '13': [6.7, 6.8, 6.9, 7.0, 7.1, 7.3, 7.5, 7.7, 7.9, 8.1, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1],
  '14': [6.6, 6.7, 6.8, 6.9, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0],
};

// 50米跑评分标准 - 女生
const femaleRun50MStandard = {
  // 年级: [分数区间对应的50米跑时间]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  // 注意：由于50米跑是成绩越低越好，所以数组中的值是升序排列的
  '1': [11.0, 11.1, 11.2, 11.5, 11.8, 12.0, 12.2, 12.4, 12.6, 12.8, 13.0, 13.2, 13.4, 13.6, 13.8, 14.0, 14.2, 14.4, 14.6, 14.8],
  '2': [10.0, 10.1, 10.2, 10.5, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0, 12.2, 12.4, 12.6, 12.8, 13.0, 13.2, 13.4, 13.6, 13.8],
  '3': [9.2, 9.3, 9.4, 9.7, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0, 12.2, 12.4, 12.6, 12.8, 13.0],
  '4': [8.7, 8.8, 8.9, 9.2, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1, 12.3, 12.5],
  '5': [8.3, 8.4, 8.5, 8.8, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9, 12.1],
  '6': [8.2, 8.3, 8.4, 8.7, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8, 12.0],
  '7': [8.1, 8.2, 8.3, 8.6, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.7, 11.9],
  '8': [8.0, 8.1, 8.2, 8.5, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6, 11.8],
  '9': [7.9, 8.0, 8.1, 8.4, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5, 11.7],
  '10': [7.8, 7.9, 8.0, 8.3, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4, 11.6],
  '11': [7.7, 7.8, 7.9, 8.2, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3, 11.5],
  '12': [7.6, 7.7, 7.8, 8.1, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2, 11.4],
  '13': [7.5, 7.6, 7.7, 8.0, 8.3, 8.5, 8.7, 8.9, 9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 10.5, 10.7, 10.9, 11.1, 11.3],
  '14': [7.4, 7.5, 7.6, 7.9, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11.0, 11.2],
};

// 对应的分数区间
const run50MScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 坐位体前屈评分标准 - 男生
const maleSitAndReachStandard = {
  // 年级: [分数区间对应的坐位体前屈值]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '1': [16.1, 14.6, 13.0, 12.0, 11.0, 9.9, 8.8, 7.7, 6.6, 5.5, 4.4, 3.3, 2.2, 1.1, 0.0, -0.8, -1.6, -2.4, -3.2, -4.0],
  '2': [16.2, 14.7, 13.2, 11.9, 10.6, 9.5, 8.4, 7.3, 6.2, 5.1, 4.0, 2.9, 1.8, 0.7, -0.4, -1.2, -2.0, -2.8, -3.6, -4.4],
  '3': [16.3, 14.9, 13.4, 11.8, 10.2, 9.1, 8.0, 6.9, 5.8, 4.7, 3.6, 2.5, 1.4, 0.3, -0.8, -1.6, -2.4, -3.2, -4.0, -4.8],
  '4': [16.4, 15.0, 13.6, 11.7, 9.8, 8.6, 7.4, 6.2, 5.0, 3.8, 2.6, 1.4, 0.2, -1.0, -2.2, -3.2, -4.2, -5.2, -6.2, -7.2],
  '5': [16.5, 15.2, 13.8, 11.6, 9.4, 8.2, 7.0, 5.8, 4.6, 3.4, 2.2, 1.0, -0.2, -1.4, -2.6, -3.6, -4.6, -5.6, -6.6, -7.6],
  '6': [16.6, 15.3, 14.0, 11.5, 9.0, 7.7, 6.4, 5.1, 3.8, 2.5, 1.2, -0.1, -1.4, -2.7, -4.0, -5.0, -6.0, -7.0, -8.0, -9.0],
  '7': [17.6, 15.9, 14.2, 12.3, 10.4, 9.1, 7.8, 6.5, 5.2, 3.9, 2.6, 1.3, 0.0, -1.3, -2.6, -3.8, -5.0, -6.2, -7.4, -8.6],
  '8': [19.6, 17.7, 15.8, 13.7, 11.6, 10.3, 9.0, 7.7, 6.4, 5.1, 3.8, 2.5, 1.2, -0.1, -1.4, -2.6, -3.8, -5.0, -6.2, -7.4],
  '9': [21.6, 19.7, 17.8, 15.8, 13.8, 12.4, 11.0, 9.6, 8.2, 6.8, 5.4, 4.0, 2.6, 1.2, -0.2, -1.4, -2.6, -3.8, -5.0, -6.2],
  '10': [23.6, 21.5, 19.4, 17.2, 15.0, 13.6, 12.2, 10.8, 9.4, 8.0, 6.6, 5.2, 3.8, 2.4, 1.0, 0.0, -1.0, -2.0, -3.0, -4.0],
  '11': [24.3, 22.4, 20.5, 18.3, 16.1, 14.7, 13.3, 11.9, 10.5, 9.1, 7.7, 6.3, 4.9, 3.5, 2.1, 1.1, 0.1, -0.9, -1.9, -2.9],
  '12': [24.6, 22.8, 21.0, 19.1, 17.2, 15.8, 14.4, 13.0, 11.6, 10.2, 8.8, 7.4, 6.0, 4.6, 3.2, 2.2, 1.2, 0.2, -0.8, -1.8],
  '13': [24.9, 23.1, 21.3, 19.5, 17.7, 16.3, 14.9, 13.5, 12.1, 10.7, 9.3, 7.9, 6.5, 5.1, 3.7, 2.7, 1.7, 0.7, -0.3, -1.3],
  '14': [25.1, 23.3, 21.5, 19.9, 18.2, 16.8, 15.4, 14.0, 12.6, 11.2, 9.8, 8.4, 7.0, 5.6, 4.2, 3.2, 2.2, 1.2, 0.2, -0.8],
};

// 坐位体前屈评分标准 - 女生
const femaleSitAndReachStandard = {
  // 年级: [分数区间对应的坐位体前屈值]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '1': [18.6, 17.3, 16.0, 14.7, 13.4, 12.3, 11.2, 10.1, 9.0, 7.9, 6.8, 5.7, 4.6, 3.5, 2.4, 1.6, 0.8, 0.0, -0.8, -1.6],
  '2': [18.9, 17.6, 16.3, 14.8, 13.3, 12.2, 11.1, 10.0, 8.9, 7.8, 6.7, 5.6, 4.5, 3.4, 2.3, 1.5, 0.7, -0.1, -0.9, -1.7],
  '3': [19.2, 17.9, 16.6, 14.9, 13.2, 12.1, 11.0, 9.9, 8.8, 7.7, 6.6, 5.5, 4.4, 3.3, 2.2, 1.4, 0.6, -0.2, -1.0, -1.8],
  '4': [19.5, 18.1, 16.9, 15.0, 13.1, 12.0, 10.9, 9.8, 8.7, 7.6, 6.5, 5.4, 4.3, 3.2, 2.1, 1.3, 0.5, -0.3, -1.1, -1.9],
  '5': [19.8, 18.5, 17.2, 15.1, 13.0, 11.9, 10.8, 9.7, 8.6, 7.5, 6.4, 5.3, 4.2, 3.1, 2.0, 1.2, 0.4, -0.4, -1.2, -2.0],
  '6': [19.9, 18.7, 17.5, 15.2, 12.9, 11.8, 10.7, 9.6, 8.5, 7.4, 6.3, 5.2, 4.1, 3.0, 1.9, 1.1, 0.3, -0.5, -1.3, -2.1],
  '7': [21.8, 20.1, 18.4, 16.7, 15.0, 13.7, 12.4, 11.1, 9.8, 8.5, 7.2, 5.9, 4.6, 3.3, 2.0, 1.2, 0.4, -0.4, -1.2, -2.0],
  '8': [22.7, 21.0, 19.3, 17.6, 15.9, 14.6, 13.3, 12.0, 10.7, 9.4, 8.1, 6.8, 5.5, 4.2, 2.9, 2.1, 1.3, 0.5, -0.3, -1.1],
  '9': [23.5, 21.8, 20.1, 18.4, 16.7, 15.4, 14.1, 12.8, 11.5, 10.2, 8.9, 7.6, 6.3, 5.0, 3.7, 2.9, 2.1, 1.3, 0.5, -0.3],
  '10': [24.2, 22.5, 20.8, 19.1, 17.4, 16.1, 14.8, 13.5, 12.2, 10.9, 9.6, 8.3, 7.0, 5.7, 4.4, 3.6, 2.8, 2.0, 1.2, 0.4],
  '11': [24.8, 23.1, 21.4, 19.7, 18.0, 16.7, 15.4, 14.1, 12.8, 11.5, 10.2, 8.9, 7.6, 6.3, 5.0, 4.2, 3.4, 2.6, 1.8, 1.0],
  '12': [25.3, 23.6, 21.9, 20.2, 18.5, 17.2, 15.9, 14.6, 13.3, 12.0, 10.7, 9.4, 8.1, 6.8, 5.5, 4.7, 3.9, 3.1, 2.3, 1.5],
  '13': [25.8, 24.0, 22.2, 20.6, 19.0, 17.7, 16.4, 15.1, 13.8, 12.5, 11.2, 9.9, 8.6, 7.3, 6.0, 5.2, 4.4, 3.6, 2.8, 2.0],
  '14': [26.3, 24.4, 22.4, 21.0, 19.5, 18.2, 16.9, 15.6, 14.3, 13.0, 11.7, 10.4, 9.1, 7.8, 6.5, 5.7, 4.9, 4.1, 3.3, 2.5],
};

// 对应的分数区间
const sitAndReachScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 1分钟跳绳评分标准 - 男生 (只有小学1-6年级)
const maleJumpRope1MinStandard = {
  // 年级: [分数区间对应的1分钟跳绳次数]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '1': [109, 104, 99, 93, 87, 80, 73, 66, 59, 52, 45, 38, 31, 24, 17, 14, 11, 8, 5, 2],
  '2': [117, 112, 107, 101, 95, 88, 81, 74, 67, 60, 53, 46, 39, 32, 25, 22, 19, 16, 13, 10],
  '3': [126, 121, 116, 110, 104, 97, 90, 83, 76, 69, 62, 55, 48, 41, 34, 31, 28, 25, 22, 19],
  '4': [137, 132, 127, 121, 115, 108, 101, 94, 87, 80, 73, 66, 59, 52, 45, 42, 39, 36, 33, 30],
  '5': [148, 143, 138, 132, 126, 119, 112, 105, 98, 91, 84, 77, 70, 63, 56, 53, 50, 47, 44, 41],
  '6': [157, 152, 147, 141, 135, 128, 121, 114, 107, 100, 93, 86, 79, 72, 65, 62, 59, 56, 53, 50],
};

// 1分钟跳绳评分标准 - 女生 (只有小学1-6年级)
const femaleJumpRope1MinStandard = {
  // 年级: [分数区间对应的1分钟跳绳次数]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '1': [117, 110, 103, 95, 87, 80, 73, 66, 59, 52, 45, 38, 31, 24, 17, 14, 11, 8, 5, 2],
  '2': [127, 120, 113, 105, 97, 90, 83, 76, 69, 62, 55, 48, 41, 34, 27, 24, 21, 18, 15, 12],
  '3': [139, 132, 125, 117, 109, 102, 95, 88, 81, 74, 67, 60, 53, 46, 39, 36, 33, 30, 27, 24],
  '4': [149, 142, 135, 127, 119, 112, 105, 98, 91, 84, 77, 70, 63, 56, 49, 46, 43, 40, 37, 34],
  '5': [158, 151, 144, 136, 128, 121, 114, 107, 100, 93, 86, 79, 72, 65, 58, 55, 52, 49, 46, 43],
  '6': [166, 159, 152, 144, 136, 129, 122, 115, 108, 101, 94, 87, 80, 73, 66, 63, 60, 57, 54, 51],
};

// 对应的分数区间
const jumpRope1MinScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 立定跳远评分标准 - 男生 (只有初中及以上年级)
const maleStandingLongJumpStandard = {
  // 年级: [分数区间对应的立定跳远距离(厘米)]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '7': [225, 218, 211, 203, 195, 191, 187, 183, 179, 175, 171, 167, 163, 159, 155, 150, 145, 140, 135, 130], // 初一
  '8': [240, 233, 226, 218, 210, 206, 202, 198, 194, 190, 186, 182, 178, 174, 170, 165, 160, 155, 150, 145], // 初二
  '9': [250, 245, 240, 233, 225, 221, 217, 213, 209, 205, 201, 197, 193, 189, 185, 180, 175, 170, 165, 160], // 初三
  '10': [260, 255, 250, 243, 235, 231, 227, 223, 219, 215, 211, 207, 203, 199, 195, 190, 185, 180, 175, 170], // 高一
  '11': [265, 260, 255, 248, 240, 236, 232, 228, 224, 220, 216, 212, 208, 204, 200, 195, 190, 185, 180, 175], // 高二
  '12': [270, 265, 260, 253, 245, 241, 237, 233, 229, 225, 221, 217, 213, 209, 205, 200, 195, 190, 185, 180], // 高三
  '13': [273, 268, 263, 256, 248, 244, 240, 236, 232, 228, 224, 220, 216, 212, 208, 203, 198, 193, 188, 183], // 大一大二
  '14': [275, 270, 265, 258, 250, 246, 242, 238, 234, 230, 226, 222, 218, 214, 210, 205, 200, 195, 190, 185], // 大三大四
};

// 立定跳远评分标准 - 女生 (只有初中及以上年级)
const femaleStandingLongJumpStandard = {
  // 年级: [分数区间对应的立定跳远距离(厘米)]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '7': [196, 190, 184, 177, 170, 167, 164, 161, 158, 155, 152, 149, 146, 143, 140, 135, 130, 125, 120, 115], // 初一
  '8': [200, 194, 188, 181, 174, 171, 168, 165, 162, 159, 156, 153, 150, 147, 144, 139, 134, 129, 124, 119], // 初二
  '9': [202, 196, 190, 183, 176, 173, 170, 167, 164, 161, 158, 155, 152, 149, 146, 141, 136, 131, 126, 121], // 初三
  '10': [204, 198, 192, 185, 178, 175, 172, 169, 166, 163, 160, 157, 154, 151, 148, 143, 138, 133, 128, 123], // 高一
  '11': [205, 199, 193, 186, 179, 176, 173, 170, 167, 164, 161, 158, 155, 152, 149, 144, 139, 134, 129, 124], // 高二
  '12': [206, 200, 194, 187, 180, 177, 174, 171, 168, 165, 162, 159, 156, 153, 150, 145, 140, 135, 130, 125], // 高三
  '13': [207, 201, 195, 188, 181, 178, 175, 172, 169, 166, 163, 160, 157, 154, 151, 146, 141, 136, 131, 126], // 大一大二
  '14': [208, 202, 196, 189, 182, 179, 176, 173, 170, 167, 164, 161, 158, 155, 152, 147, 142, 137, 132, 127], // 大三大四
};

// 对应的分数区间
const standingLongJumpScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 仰卧起坐评分标准 - 男生 (只有小学3-6年级)
const maleSitUpsStandard = {
  // 年级: [分数区间对应的仰卧起坐次数]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '3': [48, 45, 42, 39, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6],
  '4': [49, 46, 43, 40, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7],
  '5': [50, 47, 44, 41, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8],
  '6': [51, 48, 45, 42, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9],
};

// 引体向上评分标准 - 男生 (只有初中及以上年级)
const malePullUpsStandard = {
  // 年级: [分数区间对应的引体向上次数]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '7': [13, 12, 11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 5, 5, 4, 3, 2, 1, 0, 0], // 初一，注意部分分数对应相同次数
  '8': [14, 13, 12, 11, 10, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 4, 3, 2, 1, 1], // 初二
  '9': [15, 14, 13, 12, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 6, 5, 4, 3, 2, 1], // 初三
  '10': [16, 15, 14, 13, 12, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 6, 5, 4, 3, 2], // 高一
  '11': [17, 16, 15, 14, 13, 12, 12, 11, 11, 10, 10, 9, 9, 9, 8, 7, 6, 5, 4, 3], // 高二
  '12': [18, 17, 16, 15, 14, 13, 13, 12, 12, 11, 11, 10, 10, 10, 9, 8, 7, 6, 5, 4], // 高三
  '13': [19, 18, 17, 16, 15, 14, 14, 13, 13, 12, 12, 11, 11, 11, 10, 9, 8, 7, 6, 5], // 大一大二
  '14': [20, 19, 18, 17, 16, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, 10, 9, 8, 7, 6], // 大三大四
};

// 仰卧起坐评分标准 - 女生 (所有年级)
const femaleSitUpsStandard = {
  // 年级: [分数区间对应的仰卧起坐次数]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  '3': [46, 44, 42, 39, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6],
  '4': [47, 45, 43, 40, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7],
  '5': [48, 46, 44, 41, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8],
  '6': [49, 47, 45, 42, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9],
  '7': [50, 48, 46, 43, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10],
  '8': [51, 49, 47, 44, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11],
  '9': [52, 50, 48, 45, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12],
  '10': [53, 51, 49, 46, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13],
  '11': [54, 52, 50, 47, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14],
  '12': [55, 53, 51, 48, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15],
  '13': [56, 54, 52, 49, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16],
  '14': [57, 55, 53, 50, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17],
};

// 对应的分数区间
const sitUpsAndPullUpsScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 50米×8往返跑评分标准 - 男生 (只有小学5-6年级)
const maleShuttleRun50_8Standard = {
  // 年级: [分数区间对应的往返跑时间(秒)]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  // 注意：原始数据是分:秒格式，这里已转换为秒
  '5': [96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 142, 146, 150, 154, 158],
  '6': [90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 136, 140, 144, 148, 152],
};

// 50米×8往返跑评分标准 - 女生 (只有小学5-6年级)
const femaleShuttleRun50_8Standard = {
  // 年级: [分数区间对应的往返跑时间(秒)]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  // 注意：原始数据是分:秒格式，这里已转换为秒
  '5': [101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 147, 151, 155, 159, 163],
  '6': [97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 143, 147, 151, 155, 159],
};

// 1000米跑评分标准 - 男生 (只有初中及以上年级)
const maleRun1000MStandard = {
  // 年级: [分数区间对应的1000米跑时间(秒)]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  // 注意：原始数据是分:秒格式，这里已转换为秒
  '7': [235, 245, 255, 262, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 340, 360, 380, 400, 420],
  '8': [230, 235, 240, 247, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 325, 345, 365, 385, 405],
  '9': [220, 225, 230, 237, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 315, 335, 355, 375, 395],
  '10': [210, 215, 220, 227, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 305, 325, 345, 365, 385],
  '11': [205, 210, 215, 222, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 300, 320, 340, 360, 380],
  '12': [200, 205, 210, 217, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 295, 315, 335, 355, 375],
  '13': [197, 202, 207, 214, 222, 227, 232, 237, 242, 247, 252, 257, 262, 267, 272, 292, 312, 332, 352, 372],
  '14': [195, 200, 205, 212, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 290, 310, 330, 350, 370],
};

// 800米跑评分标准 - 女生 (只有初中及以上年级)
const femaleRun800MStandard = {
  // 年级: [分数区间对应的800米跑时间(秒)]
  // 格式：[分数100, 分数95, 分数90, ... , 分数10]
  // 注意：原始数据是分:秒格式，这里已转换为秒
  '7': [215, 222, 229, 237, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 305, 315, 325, 335, 345],
  '8': [210, 217, 224, 232, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 300, 310, 320, 330, 340],
  '9': [205, 212, 219, 227, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 295, 305, 315, 325, 335],
  '10': [204, 210, 216, 223, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 290, 300, 310, 320, 330],
  '11': [202, 208, 214, 221, 228, 233, 238, 243, 248, 253, 258, 263, 268, 273, 278, 288, 298, 308, 318, 328],
  '12': [200, 206, 212, 219, 226, 231, 236, 241, 246, 251, 256, 261, 266, 271, 276, 286, 296, 306, 316, 326],
  '13': [198, 204, 210, 217, 224, 229, 234, 239, 244, 249, 254, 259, 264, 269, 274, 284, 294, 304, 314, 324],
  '14': [196, 202, 208, 215, 222, 227, 232, 237, 242, 247, 252, 257, 262, 267, 272, 282, 292, 302, 312, 322],
};

// 对应的分数区间
const enduranceRunScores = [100, 95, 90, 85, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 50, 40, 30, 20, 10];

// 1分钟跳绳加分标准 - 男生 (小学1-6年级)
const maleJumpRopeBonusStandard = {
  // 年级: 对应加分的跳绳次数阈值
  // 格式：[加分1分对应次数, 加分2分对应次数, ... , 加分20分对应次数]
  '1': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '2': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '3': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '4': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '5': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '6': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
};

// 1分钟跳绳加分标准 - 女生 (小学1-6年级)
const femaleJumpRopeBonusStandard = {
  // 年级: 对应加分的跳绳次数阈值
  // 格式：[加分1分对应次数, 加分2分对应次数, ... , 加分20分对应次数]
  '1': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '2': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '3': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '4': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '5': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
  '6': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40],
};

// 跳绳加分对应的分数
const jumpRopeBonusPoints = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

// 引体向上加分标准 - 男生 (初中及以上年级)
const malePullUpsBonusStandard = {
  // 年级: 对应加分的引体向上次数阈值
  // 格式：[加分1分对应次数, 加分2分对应次数, ... , 加分10分对应次数]
  '7': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],    // 初一
  '8': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],    // 初二
  '9': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],    // 初三
  '10': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],   // 高一
  '11': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],   // 高二
  '12': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],   // 高三
  '13': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],   // 大一大二
  '14': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],   // 大三大四
};

// 引体向上加分对应的分数
const pullUpsBonusPoints = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

/**
 * 获取标准化年级值，将gradeVal(1-16)映射到标准年级(1-13)
 * @param {number} gradeVal - 后端提供的年级值(1-16)
 * @returns {string} - 标准化的年级字符串(1-13)
 */
export function getNormalizedGrade(gradeVal) {
  if (!gradeVal || gradeVal < 1) return '1';  // 默认为一年级
  
  // 小学1-6年级 -> 1-6
  if (gradeVal >= 1 && gradeVal <= 6) {
    return String(gradeVal);
  }
  // 初中7-9年级 -> 7-9
  else if (gradeVal >= 7 && gradeVal <= 9) {
    return String(gradeVal);
  }
  // 高中10-12年级 -> 10-12
  else if (gradeVal >= 10 && gradeVal <= 12) {
    return String(gradeVal);
  }
  // 大学13-16年级 -> 全部映射为13
  else if (gradeVal >= 13 && gradeVal <= 16) {
    return '13';
  }
  
  // 其他情况，默认返回1
  return '1';
}

/**
 * 计算BMI指数评分
 * @param {number} bmi - BMI指数值
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(100/80/60)
 */
export function calculateBmiScore(bmi, gender, gradeVal) {
  // 获取标准化年级
  const grade = getNormalizedGrade(gradeVal);
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleBmiStandard : femaleBmiStandard;
  const gradeStandard = standard[grade] || standard['1']; // 如果找不到对应年级，默认使用一年级标准
  
  console.log('BMI计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  
  // 解构标准值
  const [lowLimit, normalLow, normalHigh, overweightHigh] = gradeStandard;
  
  console.log('BMI标准值', '低体重上限:' + lowLimit, '正常下限:' + normalLow, '正常上限:' + normalHigh, '超重上限:' + overweightHigh);
  console.log('当前BMI值:', bmi);
  
  // 根据BMI值判断得分
  let score = 0;
  if (bmi <= lowLimit) {
    // 低体重
    score = 80;
    console.log('BMI判定: 低体重，得分:', score);
  } else if (bmi >= normalLow && bmi <= normalHigh) {
    // 正常
    score = 100;
    console.log('BMI判定: 正常，得分:', score);
  } else if (bmi > normalHigh && bmi <= overweightHigh) {
    // 超重
    score = 80;
    console.log('BMI判定: 超重，得分:', score);
  } else {
    // 肥胖
    score = 60;
    console.log('BMI判定: 肥胖，得分:', score);
  }
  
  return score;
}

/**
 * 计算肺活量评分
 * @param {number} vitalCapacity - 肺活量值(毫升)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateVitalCapacityScore(vitalCapacity, gender, gradeVal) {
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleVitalCapacityStandard : femaleVitalCapacityStandard;
  const gradeStandard = standard[grade] || standard['1']; // 如果找不到对应年级，默认使用一年级标准
  
  console.log('肺活量计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前肺活量值:', vitalCapacity);
  
  // 如果肺活量小于最低标准，返回最低分
  if (vitalCapacity < gradeStandard[gradeStandard.length - 1]) {
    console.log('肺活量低于最低标准，得分:10');
    return 10;
  }
  
  // 如果肺活量大于或等于最高标准，返回最高分
  if (vitalCapacity >= gradeStandard[0]) {
    console.log('肺活量达到或超过最高标准，得分:100');
    return 100;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (vitalCapacity >= gradeStandard[i + 1] && vitalCapacity < gradeStandard[i]) {
      const score = vitalCapacityScores[i + 1];
      console.log(`肺活量在[${gradeStandard[i+1]}, ${gradeStandard[i]})区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('肺活量计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算50米跑评分
 * @param {number} run50MTime - 50米跑时间(秒)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateRun50MScore(run50MTime, gender, gradeVal) {
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleRun50MStandard : femaleRun50MStandard;
  const gradeStandard = standard[grade] || standard['1']; // 如果找不到对应年级，默认使用一年级标准
  
  console.log('50米跑计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前50米跑时间:', run50MTime);
  
  // 50米跑成绩是越低越好
  // 如果时间小于或等于最低标准，返回最高分
  if (run50MTime <= gradeStandard[0]) {
    console.log('50米跑时间达到或优于最高标准，得分:100');
    return 100;
  }
  
  // 如果时间大于最高标准，返回最低分
  if (run50MTime > gradeStandard[gradeStandard.length - 1]) {
    console.log('50米跑时间低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间 (注意：50米跑成绩是升序排列的，与肺活量相反)
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (run50MTime > gradeStandard[i] && run50MTime <= gradeStandard[i + 1]) {
      const score = run50MScores[i + 1];
      console.log(`50米跑时间在(${gradeStandard[i]}, ${gradeStandard[i+1]}]区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('50米跑计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算坐位体前屈评分
 * @param {number} sitAndReach - 坐位体前屈值(厘米)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateSitAndReachScore(sitAndReach, gender, gradeVal) {
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleSitAndReachStandard : femaleSitAndReachStandard;
  const gradeStandard = standard[grade] || standard['1']; // 如果找不到对应年级，默认使用一年级标准
  
  console.log('坐位体前屈计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前坐位体前屈值:', sitAndReach);
  
  // 如果坐位体前屈值大于或等于最高标准，返回最高分
  if (sitAndReach >= gradeStandard[0]) {
    console.log('坐位体前屈值达到或超过最高标准，得分:100');
    return 100;
  }
  
  // 如果坐位体前屈值小于最低标准，返回最低分
  if (sitAndReach < gradeStandard[gradeStandard.length - 1]) {
    console.log('坐位体前屈值低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (sitAndReach < gradeStandard[i] && sitAndReach >= gradeStandard[i + 1]) {
      const score = sitAndReachScores[i + 1];
      console.log(`坐位体前屈值在[${gradeStandard[i+1]}, ${gradeStandard[i]})区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('坐位体前屈计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算1分钟跳绳评分
 * @param {number} jumpRopeCount - 1分钟跳绳次数
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateJumpRope1MinScore(jumpRopeCount, gender, gradeVal) {
  // 获取标准化年级(1-6)
  let grade = getNormalizedGrade(gradeVal);
  
  // 1分钟跳绳只适用于小学1-6年级
  if (gradeVal > 6) {
    console.log('1分钟跳绳项目只适用于小学1-6年级，当前年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleJumpRope1MinStandard : femaleJumpRope1MinStandard;
  const gradeStandard = standard[grade] || standard['1']; // 如果找不到对应年级，默认使用一年级标准
  
  console.log('1分钟跳绳计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前1分钟跳绳次数:', jumpRopeCount);
  
  // 如果跳绳次数大于或等于最高标准，返回最高分
  if (jumpRopeCount >= gradeStandard[0]) {
    console.log('1分钟跳绳次数达到或超过最高标准，得分:100');
    return 100;
  }
  
  // 如果跳绳次数小于最低标准，返回最低分
  if (jumpRopeCount < gradeStandard[gradeStandard.length - 1]) {
    console.log('1分钟跳绳次数低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (jumpRopeCount < gradeStandard[i] && jumpRopeCount >= gradeStandard[i + 1]) {
      const score = jumpRope1MinScores[i + 1];
      console.log(`1分钟跳绳次数在[${gradeStandard[i+1]}, ${gradeStandard[i]})区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('1分钟跳绳计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算立定跳远评分
 * @param {number} standingLongJump - 立定跳远距离(厘米)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateStandingLongJumpScore(standingLongJump, gender, gradeVal) {
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 立定跳远只适用于初中及以上年级(7-16)
  if (gradeVal < 7) {
    console.log('立定跳远项目只适用于初中及以上年级，当前年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleStandingLongJumpStandard : femaleStandingLongJumpStandard;
  const gradeStandard = standard[grade] || standard['7']; // 如果找不到对应年级，默认使用初一标准
  
  console.log('立定跳远计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前立定跳远距离:', standingLongJump);
  
  // 如果立定跳远距离大于或等于最高标准，返回最高分
  if (standingLongJump >= gradeStandard[0]) {
    console.log('立定跳远距离达到或超过最高标准，得分:100');
    return 100;
  }
  
  // 如果立定跳远距离小于最低标准，返回最低分
  if (standingLongJump < gradeStandard[gradeStandard.length - 1]) {
    console.log('立定跳远距离低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (standingLongJump < gradeStandard[i] && standingLongJump >= gradeStandard[i + 1]) {
      const score = standingLongJumpScores[i + 1];
      console.log(`立定跳远距离在[${gradeStandard[i+1]}, ${gradeStandard[i]})区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('立定跳远计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算仰卧起坐评分
 * @param {number} sitUpsCount - 仰卧起坐次数
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateSitUpsScore(sitUpsCount, gender, gradeVal) {
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 检查是否适用于当前年级和性别
  // 男生只有小学3-6年级测仰卧起坐，其他年级测引体向上
  if (gender === 1 && (gradeVal < 3 || gradeVal > 6)) {
    console.log('男生仰卧起坐项目只适用于小学3-6年级，当前年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 女生所有年级都测仰卧起坐
  // 但年级必须大于等于3年级
  if (gradeVal < 3) {
    console.log('仰卧起坐项目只适用于小学3年级及以上，当前年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleSitUpsStandard : femaleSitUpsStandard;
  const gradeStandard = standard[grade] || standard['3']; // 如果找不到对应年级，默认使用三年级标准
  
  console.log('仰卧起坐计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前仰卧起坐次数:', sitUpsCount);
  
  // 如果仰卧起坐次数大于或等于最高标准，返回最高分
  if (sitUpsCount >= gradeStandard[0]) {
    console.log('仰卧起坐次数达到或超过最高标准，得分:100');
    return 100;
  }
  
  // 如果仰卧起坐次数小于最低标准，返回最低分
  if (sitUpsCount < gradeStandard[gradeStandard.length - 1]) {
    console.log('仰卧起坐次数低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (sitUpsCount < gradeStandard[i] && sitUpsCount >= gradeStandard[i + 1]) {
      const score = sitUpsAndPullUpsScores[i + 1];
      console.log(`仰卧起坐次数在[${gradeStandard[i+1]}, ${gradeStandard[i]})区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('仰卧起坐计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算引体向上评分
 * @param {number} pullUpsCount - 引体向上次数
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculatePullUpsScore(pullUpsCount, gender, gradeVal) {
  // 引体向上只适用于男生初中及以上年级
  if (gender !== 1 || gradeVal < 7) {
    console.log('引体向上项目只适用于男生初中及以上年级，当前性别:' + (gender === 1 ? '男' : '女') + '，年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 获取对应年级的标准
  const gradeStandard = malePullUpsStandard[grade] || malePullUpsStandard['7']; // 如果找不到对应年级，默认使用初一标准
  
  console.log('引体向上计算', '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前引体向上次数:', pullUpsCount);
  
  // 如果引体向上次数大于或等于最高标准，返回最高分
  if (pullUpsCount >= gradeStandard[0]) {
    console.log('引体向上次数达到或超过最高标准，得分:100');
    return 100;
  }
  
  // 由于引体向上的标准有可能有相同的次数对应不同的分数
  // 需要特殊处理，从高分向低分遍历找到第一个小于等于当前次数的标准
  for (let i = 0; i < gradeStandard.length; i++) {
    if (pullUpsCount >= gradeStandard[i]) {
      const score = sitUpsAndPullUpsScores[i];
      console.log(`引体向上次数为${pullUpsCount}，对应标准${gradeStandard[i]}，得分:${score}`);
      if(pullUpsCount >= 20){   // 20次以上才有加分
        return score + calculatePullUpsBonusPoints(pullUpsCount, score, gender, gradeVal);
      }
      return score;
    }
  }
  
  // 如果次数低于最低标准，返回最低分
  console.log('引体向上次数低于最低标准，得分:10');
  return 10;
}

/**
 * 计算仰卧起坐或引体向上评分（根据性别和年级自动选择）
 * @param {number} count - 测试次数
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateSitUpsOrPullUpsScore(count, gender, gradeVal) {
  // 根据性别和年级判断应该使用哪种测试
  // 男生小学3-6年级测仰卧起坐，初中及以上测引体向上
  // 女生所有年级测仰卧起坐
  if (gender === 1 && gradeVal >= 7) {
    // 男生初中及以上年级：引体向上
    return calculatePullUpsScore(count, gender, gradeVal);
  } else {
    // 女生所有年级或男生小学3-6年级：仰卧起坐
    return calculateSitUpsScore(count, gender, gradeVal);
  }
}

/**
 * 计算50米×8往返跑评分
 * @param {number} shuttleRunTime - 50米×8往返跑时间(秒)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateShuttleRun50_8Score(shuttleRunTime, gender, gradeVal) {
  // 获取标准化年级
  let grade = getNormalizedGrade(gradeVal);
  
  // 50米×8往返跑只适用于小学5-6年级
  if (gradeVal < 5 || gradeVal > 6) {
    console.log('50米×8往返跑项目只适用于小学5-6年级，当前年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleShuttleRun50_8Standard : femaleShuttleRun50_8Standard;
  const gradeStandard = standard[grade] || standard['5']; // 如果找不到对应年级，默认使用五年级标准
  
  console.log('50米×8往返跑计算', '性别:' + (gender === 1 ? '男' : '女'), '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前50米×8往返跑时间(秒):', shuttleRunTime);
  
  // 往返跑时间是越低越好
  // 如果时间小于或等于最低标准，返回最高分
  if (shuttleRunTime <= gradeStandard[0]) {
    console.log('50米×8往返跑时间达到或优于最高标准，得分:100');
    return 100;
  }
  
  // 如果时间大于最高标准，返回最低分
  if (shuttleRunTime > gradeStandard[gradeStandard.length - 1]) {
    console.log('50米×8往返跑时间低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间 (注意：往返跑成绩是升序排列的，与肺活量相反)
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (shuttleRunTime > gradeStandard[i] && shuttleRunTime <= gradeStandard[i + 1]) {
      const score = enduranceRunScores[i + 1];
      console.log(`50米×8往返跑时间在(${gradeStandard[i]}, ${gradeStandard[i+1]}]区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('50米×8往返跑计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算1000米跑评分
 * @param {number} run1000MTime - 1000米跑时间(秒)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateRun1000MScore(run1000MTime, gender, gradeVal) {
  // 1000米跑只适用于男生初中及以上年级
  if (gender !== 1 || gradeVal < 7) {
    console.log('1000米跑项目只适用于男生初中及以上年级，当前性别:' + (gender === 1 ? '男' : '女') + '，年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 获取对应年级的标准
  const gradeStandard = maleRun1000MStandard[grade] || maleRun1000MStandard['7']; // 如果找不到对应年级，默认使用初一标准
  
  console.log('1000米跑计算', '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前1000米跑时间(秒):', run1000MTime);
  
  // 1000米跑时间是越低越好
  // 如果时间小于或等于最低标准，返回最高分
  if (run1000MTime <= gradeStandard[0]) {
    console.log('1000米跑时间达到或优于最高标准，得分:100');
    return 100;
  }
  
  // 如果时间大于最高标准，返回最低分
  if (run1000MTime > gradeStandard[gradeStandard.length - 1]) {
    console.log('1000米跑时间低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (run1000MTime > gradeStandard[i] && run1000MTime <= gradeStandard[i + 1]) {
      const score = enduranceRunScores[i + 1];
      console.log(`1000米跑时间在(${gradeStandard[i]}, ${gradeStandard[i+1]}]区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('1000米跑计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算800米跑评分
 * @param {number} run800MTime - 800米跑时间(秒)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateRun800MScore(run800MTime, gender, gradeVal) {
  // 800米跑只适用于女生初中及以上年级
  if (gender !== 2 || gradeVal < 7) {
    console.log('800米跑项目只适用于女生初中及以上年级，当前性别:' + (gender === 1 ? '男' : '女') + '，年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 获取对应年级的标准
  const gradeStandard = femaleRun800MStandard[grade] || femaleRun800MStandard['7']; // 如果找不到对应年级，默认使用初一标准
  
  console.log('800米跑计算', '原始年级:' + gradeVal, '标准年级:' + grade);
  console.log('当前800米跑时间(秒):', run800MTime);
  
  // 800米跑时间是越低越好
  // 如果时间小于或等于最低标准，返回最高分
  if (run800MTime <= gradeStandard[0]) {
    console.log('800米跑时间达到或优于最高标准，得分:100');
    return 100;
  }
  
  // 如果时间大于最高标准，返回最低分
  if (run800MTime > gradeStandard[gradeStandard.length - 1]) {
    console.log('800米跑时间低于最低标准，得分:10');
    return 10;
  }
  
  // 查找对应的分数区间
  for (let i = 0; i < gradeStandard.length - 1; i++) {
    if (run800MTime > gradeStandard[i] && run800MTime <= gradeStandard[i + 1]) {
      const score = enduranceRunScores[i + 1];
      console.log(`800米跑时间在(${gradeStandard[i]}, ${gradeStandard[i+1]}]区间，得分:${score}`);
      return score;
    }
  }
  
  // 默认返回最低分
  console.log('800米跑计算异常，返回默认得分:10');
  return 10;
}

/**
 * 计算耐力跑评分（根据性别和年级自动选择项目）
 * @param {number} runTime - 耐力跑时间(秒)
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 评分(10-100)
 */
export function calculateEnduranceRunScore(runTime, gender, gradeVal) {
  // 根据性别和年级判断应该使用哪种测试
  if (gradeVal >= 5 && gradeVal <= 6) {
    // 小学5-6年级：50米×8往返跑
    return calculateShuttleRun50_8Score(runTime, gender, gradeVal);
  } else if (gradeVal >= 7) {
    if (gender === 1) {
      // 男生初中及以上：1000米跑
      return calculateRun1000MScore(runTime, gender, gradeVal);
    } else if (gender === 2) {
      // 女生初中及以上：800米跑
      return calculateRun800MScore(runTime, gender, gradeVal);
    }
  } else {
    // 小学1-4年级不测耐力跑
    console.log('小学1-4年级不测耐力跑，当前年级:', gradeVal);
    return 0; // 返回0表示不适用
  }
  
  // 未识别的性别
  console.log('未识别的性别值:', gender);
  return 0;
}

/**
 * 计算1分钟跳绳加分
 * @param {number} jumpRopeCount - 1分钟跳绳次数
 * @param {number} baseScore - 基础得分
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 加分分数
 */
export function calculateJumpRopeBonusPoints(jumpRopeCount, baseScore, gender, gradeVal) {
  // 如果基础分数不足100分，不计算加分
  if (baseScore < 100) {
    console.log('基础分数不足100分，不计算加分');
    return 0;
  }
  
  // 如果不是小学1-6年级，不计算加分
  if (gradeVal < 1 || gradeVal > 6) {
    console.log('1分钟跳绳加分项目只适用于小学1-6年级，当前年级:', gradeVal);
    return 0;
  }
  
  // 获取标准化年级
  const grade = getNormalizedGrade(gradeVal);
  
  // 根据性别选择标准
  const standard = gender === 1 ? maleJumpRopeBonusStandard : femaleJumpRopeBonusStandard;
  const gradeStandard = standard[grade] || standard['1']; // 如果找不到对应年级，默认使用一年级标准
  
  // 计算超过基本标准(100分)的次数
  const baseStandard = gender === 1 ? maleJumpRope1MinStandard : femaleJumpRope1MinStandard;
  const baseGradeStandard = baseStandard[grade] || baseStandard['1'];
  const baseThreshold = baseGradeStandard[0]; // 100分对应的次数
  
  // 计算超过基础分数的次数
  const extraCount = jumpRopeCount - baseThreshold;
  
  console.log('1分钟跳绳加分计算', '性别:' + (gender === 1 ? '男' : '女'), '年级:' + grade);
  console.log('当前跳绳次数:', jumpRopeCount, '基础满分对应次数:', baseThreshold, '超出次数:', extraCount);
  
  // 如果没有超过基础分数的满分次数，不加分
  if (extraCount <= 0) {
    console.log('未超过基础满分次数，不加分');
    return 0;
  }
  
  // 根据超出的次数计算加分
  let bonusPoints = 0;
  for (let i = gradeStandard.length - 1; i >= 0; i--) {
    if (extraCount >= gradeStandard[i]) {
      bonusPoints = jumpRopeBonusPoints[i];
      console.log(`超出${extraCount}次，达到加分标准${gradeStandard[i]}次，加分:${bonusPoints}分`);
      return bonusPoints;
    }
  }
  
  // 如果未达到最低加分标准
  console.log('未达到最低加分标准，不加分');
  return 0;
}

/**
 * 计算引体向上加分
 * @param {number} pullUpsCount - 引体向上次数
 * @param {number} baseScore - 基础得分
 * @param {number} gender - 性别(1男, 2女)
 * @param {number} gradeVal - 年级(1-16)
 * @returns {number} - 加分分数
 */
export function calculatePullUpsBonusPoints(pullUpsCount, baseScore, gender, gradeVal) {
  // 如果基础分数不足100分，不计算加分
  if (baseScore < 100) {
    console.log('基础分数不足100分，不计算加分');
    return 0;
  }
  
  // 引体向上加分只适用于男生初中及以上年级
  if (gender !== 1 || gradeVal < 7) {
    console.log('引体向上加分项目只适用于男生初中及以上年级，当前性别:' + (gender === 1 ? '男' : '女') + '，年级:', gradeVal);
    return 0;
  }
  
  // 获取标准化年级(1-14)
  let grade = getNormalizedGrade(gradeVal);
  
  // 将大学年级(13-16)分为大一大二(13)和大三大四(14)
  if (grade === '13') {
    if (gradeVal >= 15) {
      grade = '14'; // 大三大四使用14级标准
    }
  }
  
  // 获取对应年级的标准
  const standard = malePullUpsBonusStandard;
  const gradeStandard = standard[grade] || standard['7']; // 如果找不到对应年级，默认使用初一标准
  
  // 计算超过基本标准(100分)的次数
  const baseStandard = malePullUpsStandard;
  const baseGradeStandard = baseStandard[grade] || baseStandard['7'];
  const baseThreshold = baseGradeStandard[0]; // 100分对应的次数
  
  // 计算超过基础分数的次数
  const extraCount = pullUpsCount - baseThreshold;
  
  console.log('引体向上加分计算', '年级:', grade);
  console.log('当前引体向上次数:', pullUpsCount, '基础满分对应次数:', baseThreshold, '超出次数:', extraCount);
  
  // 如果没有超过基础分数的满分次数，不加分
  if (extraCount <= 0) {
    console.log('未超过基础满分次数，不加分');
    return 0;
  }
  
  // 根据超出的次数计算加分
  let bonusPoints = 0;
  for (let i = gradeStandard.length - 1; i >= 0; i--) {
    if (extraCount >= gradeStandard[i]) {
      bonusPoints = pullUpsBonusPoints[i];
      console.log(`超出${extraCount}次，达到加分标准${gradeStandard[i]}次，加分:${bonusPoints}分`);
      return bonusPoints;
    }
  }
  
  // 如果未达到最低加分标准
  console.log('未达到最低加分标准，不加分');
  return 0;
}

/**
 * 自动计算各项测试的数值化得分，并计算额外加分
 * @param {string} itemCode - 测试项目代码或名称
 * @param {number} grade - 原始成绩
 * @param {Object} studentInfo - 学生信息，包含性别和年级
 * @param {number} baseScore - 之前计算的基础得分（可选，用于计算加分）
 * @returns {Object} - {score: 数值化得分, bonus: 额外加分}
 */
export function calculateScoreWithBonus(itemCode, grade, studentInfo, baseScore = 0) {
  if (!itemCode || grade === null || grade === undefined) {
    return { score: 0, bonus: 0 };
  }
  
  const { gender, gradeVal } = studentInfo;
  
  // 尝试通过名称获取编码
  const code = testItemCodeMap[itemCode] || itemCode;
  
  console.log('计算得分和加分', '项目:', itemCode, '原始成绩:', grade, '性别:', gender, '年级:', gradeVal);
  
  // 基础得分
  let score = 0;
  // 额外加分
  let bonus = 0;
  
  // 根据测试项目代码选择不同的评分标准和计算方法
  switch (code) {
    case 'JUMP_ROPE_1MIN':
      // 计算基础得分
      score = calculateJumpRope1MinScore(grade, gender, gradeVal);
      // 如果有基础得分参数，使用参数值
      if (baseScore > 0) score = baseScore;
      // 计算额外加分
      bonus = calculateJumpRopeBonusPoints(grade, score, gender, gradeVal);
      break;
    case 'PULL_UPS':
      // 计算基础得分
      score = calculatePullUpsScore(grade, gender, gradeVal);
      // 如果有基础得分参数，使用参数值
      if (baseScore > 0) score = baseScore;
      // 计算额外加分
      bonus = calculatePullUpsBonusPoints(grade, score, gender, gradeVal);
      break;
    case 'SIT_UPS_OR_PULL_UPS':
      // 如果是男生初中及以上年级，自动使用引体向上
      if (gender === 1 && gradeVal >= 7) {
        // 计算基础得分
        score = calculatePullUpsScore(grade, gender, gradeVal);
        // 如果有基础得分参数，使用参数值
        if (baseScore > 0) score = baseScore;
        // 计算额外加分
        bonus = calculatePullUpsBonusPoints(grade, score, gender, gradeVal);
      } else {
        // 其他情况使用仰卧起坐（不计算加分）
        score = calculateSitUpsScore(grade, gender, gradeVal);
        if (baseScore > 0) score = baseScore;
      }
      break;
    // 其他项目暂不支持加分
    default:
      score = calculateScore(itemCode, grade, studentInfo);
      bonus = 0;
  }
  
  return { score, bonus };
}

// 测试项目映射表，将项目名称映射到计算函数
const testItemFunctionMap = {
  'BMI': calculateBmiScore,
  '肺活量': calculateVitalCapacityScore,
  '50米跑': calculateRun50MScore,
  '坐位体前屈': calculateSitAndReachScore,
  '1分钟跳绳': calculateJumpRope1MinScore,
  '立定跳远': calculateStandingLongJumpScore,
  '仰卧起坐': calculateSitUpsScore,
  '引体向上': calculatePullUpsScore,
  '仰卧起坐或引体向上': calculateSitUpsOrPullUpsScore,
  '50*8往返跑': calculateShuttleRun50_8Score,
  '1000米跑': calculateRun1000MScore,
  '800米跑': calculateRun800MScore,
  '耐力跑': calculateEnduranceRunScore,
};

// 测试项目编码映射表，用于通过名称获取编码
const testItemCodeMap = {
  'BMI': 'BMI',
  '肺活量': 'VITAL_CAPACITY',
  '50米跑': 'RUN_50M',
  '坐位体前屈': 'SIT_AND_REACH',
  '1分钟跳绳': 'JUMP_ROPE_1MIN',
  '立定跳远': 'STANDING_LONG_JUMP',
  '仰卧起坐': 'SIT_UPS',
  '引体向上': 'PULL_UPS',
  '仰卧起坐或引体向上': 'SIT_UPS_OR_PULL_UPS',
  '50*8往返跑': 'SHUTTLE_RUN_50_8',
  '1000米跑': 'RUN_1000M',
  '800米跑': 'RUN_800M',
  '耐力跑': 'ENDURANCE_RUN',
};

/**
 * 根据测试项目名称获取项目编码
 * @param {string} itemName - 测试项目名称
 * @returns {string} - 测试项目编码
 */
export function getItemCodeByName(itemName) {
  return testItemCodeMap[itemName] || itemName;
}

/**
 * 自动计算各项测试的数值化得分
 * @param {string} itemCode - 测试项目代码或名称
 * @param {number} grade - 原始成绩
 * @param {Object} studentInfo - 学生信息，包含性别和年级
 * @returns {number} - 数值化得分
 */
export function calculateScore(itemCode, grade, studentInfo) {
  if (!itemCode || grade === null || grade === undefined) {
    return 0;
  }
  
  const { gender, gradeVal } = studentInfo;
  
  // 尝试通过名称获取编码
  const code = testItemCodeMap[itemCode] || itemCode;
  
  console.log('计算得分', '项目:', itemCode, '原始成绩:', grade, '性别:', gender, '年级:', gradeVal);
  
  // 根据测试项目代码选择不同的评分标准和计算方法
  switch (code) {
    case 'BMI':
      return calculateBmiScore(grade, gender, gradeVal);
    case 'VITAL_CAPACITY':
      return calculateVitalCapacityScore(grade, gender, gradeVal);
    case 'RUN_50M':
      return calculateRun50MScore(grade, gender, gradeVal);
    case 'SIT_AND_REACH':
      return calculateSitAndReachScore(grade, gender, gradeVal);
    case 'JUMP_ROPE_1MIN':
      return calculateJumpRope1MinScore(grade, gender, gradeVal);
    case 'STANDING_LONG_JUMP':
      return calculateStandingLongJumpScore(grade, gender, gradeVal);
    case 'SIT_UPS':
      return calculateSitUpsScore(grade, gender, gradeVal);
    case 'PULL_UPS':
      return calculatePullUpsScore(grade, gender, gradeVal);
    case 'SIT_UPS_OR_PULL_UPS':
      return calculateSitUpsOrPullUpsScore(grade, gender, gradeVal);
    case 'SHUTTLE_RUN_50_8':
      return calculateShuttleRun50_8Score(grade, gender, gradeVal);
    case 'RUN_1000M':
      return calculateRun1000MScore(grade, gender, gradeVal);
    case 'RUN_800M':
      return calculateRun800MScore(grade, gender, gradeVal);
    case 'ENDURANCE_RUN':
      return calculateEnduranceRunScore(grade, gender, gradeVal);
    // 其他测试项目的计算方法将在这里添加
    default:
      // 临时返回一个基础分数，后续可以完善其他项目的计算
      console.log(`暂未实现 ${itemCode} 的评分计算，返回默认分数`);
      return 80;
  }
}

/**
 * 自动计算各项测试的数值化得分（通过测试项目名称）
 * @param {string} itemName - 测试项目名称
 * @param {number} grade - 原始成绩
 * @param {Object} studentInfo - 学生信息，包含性别和年级
 * @returns {number} - 数值化得分
 */
export function calculateScoreByItemName(itemName, grade, studentInfo) {
  const itemCode = getItemCodeByName(itemName);
  return calculateScore(itemCode, grade, studentInfo);
}

export default {
  calculateScore,
  calculateScoreByItemName,
  calculateScoreWithBonus,
  calculateBmiScore,
  calculateVitalCapacityScore,
  calculateRun50MScore,
  calculateSitAndReachScore,
  calculateJumpRope1MinScore,
  calculateJumpRopeBonusPoints,
  calculateStandingLongJumpScore,
  calculateSitUpsScore,
  calculatePullUpsScore,
  calculatePullUpsBonusPoints,
  calculateSitUpsOrPullUpsScore,
  calculateShuttleRun50_8Score,
  calculateRun1000MScore,
  calculateRun800MScore,
  calculateEnduranceRunScore,
  getItemCodeByName,
  getNormalizedGrade
}; 